<?php

 require_once 'toolkit/settings.php';
 require_once  SERVERPATH . '/classes/DB.php';
 require_once  SERVERPATH . '/classes/User.php';
 require_once  SERVERPATH . '/classes/Error.php';
 require_once  SERVERPATH . '/classes/Tipp.php';
 require_once  SERVERPATH . '/classes/Ergebnisse.php';
 
 /**
  * Funktionen zum Erstellen der Statisik
  * Aufbau der Arrays (2D)
  * 1. Dimension = Rang
  * 2. Dimension = Info zu Tipper
  * 	('user' = username 
  * 	 'uid' = userID
  * 	'erg' = Punkte für richtige Ergebisse
  * 	'diff' = Punkte für richtige Differenz
  * 	'tend' = Punkte für richtige Tendenz
  * 	)
  * 
  * @author Stephan Behrndt
  */
 
 	/**
 	 * Liefert ein Array mit den Top10-Tippern
 	 * @param int liga ID der Liga für die Statistik
 	 * @return Array mit Top10-Tippern 
 	 */
 	function getTop10Tipper($liga) {
 		// Statistiktablle abrufen
 		$gesamt = getStatistiktabelle($liga);
 		
 		// Ersten 10 in Array kopieren
 		$top10 = array();
 		for($i = 0; $i <= 9; $i++){
 			$top10[$i] = $gesamt[$i];
 		}
 		return $top10;
 	}
 	
 	/**
 	 * Liefert die aktuelle Punktzahl zu einer UserID
 	 * @param int uid UserID
 	 * @param int liga ID der Liga für die Statistik
 	 * @return 1-dimensionales Array mit Informationen zu Tipper
 	 */
 	function getScoreById($uid, $liga) {
 		// Array holen
 		return getScoreByIdAndPlayday($uid, $liga, "");
 	}
 	
 	/**
 	 * Liefert die Punktzahl für einen UserID
 	 * @param int uid UserID
 	 * @param int liga ID der Liga für die Statistik
 	 * @param int playday Spieltag als Eingrenzung der Berechnung ("" -> Spieltag wird nicht berücksichtigt)
 	 * @param boolean until Nur bei Angabe eines Spieltags relevant
 	 * 								  true wenn alle Tipps bis zu diesem Spieltag ausgewertet werden sollen
 	 * 								  false wenn nur Tipps für diesen Spieltags ausgewertet werden sollen
 	 * @return 1-dimensionales Array mit Informationen zu Tipper
 	 */
 	function getScoreByIdAndPlayday($uid, $liga, $playday, $until) {
 		$tipp = new Tipp();
 		$ergebnisse = new Ergebnisse();
 		
 		// Abrufen der Ergebnisse / Tipps
 		if(empty($playday)){
 			// alle Tipps und Ergebnisse berücksichtigen
 			$ergebnisse->getErgebnissePerLiga($liga);
 			$tipp->getTippsByUserIdAndLiga ($uid, $liga);
 		}
 		else{
 			if($until){
 				// nur Tipps bis zu diesem Spieltag berücksichtigen
 				$ergebnisse->getErgebnisUntilGameDay($liga, $playday);
 				$tipp->getUserTippsUntilGameDay($uid, $liga, $playday);
 			}
 			else{
 				// nur Tipps von diesem Spieltag berücksichtigen
 				$ergebnisse->getErgebnisPerGameDay($liga, $playday);
 				$tipp->getUserTippsPerGameDay($uid, $liga, $playday);
 			}
 		}
 		
 		// Ergebnis und Tipp Arrays speichern
 		$userTipps = $tipp->tipps;
 		$ergs = $ergebnisse->ergebnisse;
		
		// Punktevergabe abrufen
 		$score = getScore();
 		
 		// Ergebnis Array vorbereiten
 		$user = new User();
 		$userScore = array(
 							'user' => $user->getUserNameFromId($uid),
 							'uid' => $uid,
 							'erg' => 0,
 							'diff' => 0,
 							'tend' => 0);
 		
 		// Überpprüfen ob Tipps und Ergebnisse vorhanden
 		if(count($userTipps) == 0 || count($ergs) == 0){
 			return $userScore;
 		}
 		
 		// Alle Ergebnisse durchlaufen und mit Tipps vergleichen
 		foreach($ergs as $spiel => $erg){
 			if($erg['tore_heim'] == $userTipps[$spiel]['tipp_heim'] &&
 					$erg['tore_auswaerts'] == $userTipps[$spiel]['tipp_auswaerts']){
 				// Ergebnis richtig
 				$userScore['erg'] = $userScore['erg'] + $score['erg'];	
 			}
 			else if(($erg['tore_heim'] - $erg['tore_auswaerts']) == 
 						($userTipps[$spiel]['tipp_heim'] - $userTipps[$spiel]['tipp_auswaerts'])
 						&& ($userTipps[$spiel]['tipp_heim'] >= 1 || $userTipps[$spiel]['tipp_heim'] == "1")
 						&& ($userTipps[$spiel]['tipp_auswaerts'] >= 1 || $userTipps[$spiel]['tipp_auswaerts'] == "1")){
 				// Tordifferenz richtig
 				$userScore['diff'] = $userScore['diff'] + $score['diff'];
 			}
 			else if((($erg['tore_heim'] - $erg['tore_auswaerts']) > 0 && 
 						($userTipps[$spiel]['tipp_heim'] - $userTipps[$spiel]['tipp_auswaerts']) > 0) ||
 						(($erg['tore_heim'] - $erg['tore_auswaerts']) < 0 && 
 						($userTipps[$spiel]['tipp_heim'] - $userTipps[$spiel]['tipp_auswaerts']) < 0)){
 				// Tendenz richtig
 				$userScore['tend'] = $userScore['tend'] + $score['tend'];
 			}
 		}
 		
 		return $userScore;
 	}
 	
 	/**
 	 * Liefert die Statistiktabelle für eine Liga
 	 * @param int $liga Id der Liga für die Statistik
 	 * @return 2D-Array mit Rang und Tipper-Informationen
 	 */
 	function getStatistiktabelle ($liga) {
 		return getStatistiktabelleByPlayday($liga, "", ""); 
 	}
 	
 	/**
 	 * Liefert die Statistiktabelle für eine Liga mit Berücksichtigung des Spieltags
 	 * @param int $liga Id der Liga für die Statistik
 	 * @param int playday Spieltag als Eingrenzung der Berechnung ("" -> Spieltag wird nicht berücksichtigt)
 	 * @param boolean until Nur bei Angabe eines Spieltags relevant
 	 * 								  true wenn alle Tipps bis zu diesem Spieltag ausgewertet werden sollen
 	 * 								  false wenn nur Tipps für diesen Spieltags ausgewertet werden sollen
 	 *
 	 * @return 2D-Array mit Rang und Tipper-Informationen
 	 */
 	function getStatistiktabelleByPlayday($liga, $playday, $until) {
 		// alle User holen
 		$user = new User();
 		$userlist = $user->getAllUsers();
 		$result = array();
	 	// Statisitk für alle User berechnen
 		foreach($userlist as $user){
 			$userScore = getScoreByIdAndPlayday($user, $liga, $playday, $until);
			$result[] = $userScore;	

 		}
		// Array nach Punktzahl sortieren 		
 		usort($result, 'compare');
 		
 		return $result;
 	}
 	
 	/**
 	 * Definition:
 	 * Besser:			+ 1
 	 * Gleich:			0
 	 * Schlechter:		- 1
 	 */
 	function getScoreTendenzById($uid) {
 		
 	}
 	
 	/**
 	 * Funktion zum Vergleichen der Array-Werte
 	 */
 	function compare($user1, $user2){
 		// Gesamtpunktzahl berechnen
 		$punkte1 = $user1['erg'] + $user1['diff'] + $user1['tend'];
 		$punkte2 = $user2['erg'] + $user2['diff'] + $user2['tend'];
 		
 		if($punkte1 > $punkte2){
 			// User1 besser platziert als User2 (Gesamtpunktzahl)
 			return -1;
 		}
 		else if($punkte1 < $punkte2){
 			// User1 schlechter platziert als User2 (Gesamtpunktzahl)
 			return 1;
 		}
 		else{
 			// User haben gleiche Gesamtpunktzahl
 			// Entscheidung nach Punkten bei richtigen Ergebnis
 			if ($user1['erg'] > $user2['erg']){
 				// Mehr Punkte durch richtiges Ergebnis bei User1
 				return -1;
 			}
 			else if ($user1['erg'] < $user2['erg']){
 				// Weniger Punkte durch richtiges Ergebnis bei User1
 				return 1;
 			}
 			else{
 				// Gleiche Punktzahl auch bei richtigem Ergebnis
 				// Entscheidung nach Punkten bei richtiger Tordifferenz
 				if ($user1['diff'] > $user2['diff']){
 					// Mehr Punkte durch richtige Tordifferenz bei User1
 					return -1;
 				}
 				else if ($user1['diff'] < $user2['diff']){
	 				// Weniger Punkte durch richtige Tordifferenz bei User1
 					return 1;
 				}
 				else{
 					// Gleiche Punktzahl auch bei richtiger Tordifferenz
 					// Entscheidung nach Punkten bei richtiger Tendenz
 					if ($user1['tend'] > $user2['tend']){
	 					// Mehr Punkte durch richtige Tendenz bei User1
 						return -1;
 					}
 					else if ($user1['tend'] < $user2['tend']){
	 					// Weniger Punkte durch richtige Tendenz bei User1
 						return 1;
 					}
 					else{
 						// User1 und User2 haben exakt gleiche Punkte
 						// Sie liegen somit auf dem gleich Platz
 						return 0;
 					}
 				}
 			}
 		}
 	}
 	
 	/**
 	 * Liefert ein Array mit den Punkten für die Statistikberechnung
 	 * Array-Positionen:
 	 * 		 * 	'erg' = Punkte für richtige Ergebisse
	 * 			'diff' = Punkte für richtige Differenz
     * 			'tend' = Punkte für richtige Tendenz
     * @return Array mit Punkten
 	 */
 	function getScore(){
 		$mysql = new DB();
 		
 		// SQL-Statement
 		$query 		= 	"SELECT id, punkte
						FROM stedano_bewertung";
		
		// Prepared Statement vorbereiten
		if($stmt = $mysql->conn->prepare($query)) {
			
			// Statement ausführen
			$stmt->execute();
			$id = null;
			$punkte = null;
			
			// Ergebnisse in Variablen speichern
			$stmt->bind_result($id, $punkte);
			
			$result = array();
			 
			// Ergebnisse abrufen
			while($stmt->fetch()) {
				// Unterscheidung nach ID
				switch($id){
					case 2: $result['tend'] = $punkte;
								break;
					case 3: $result['diff'] = $punkte;
								break;
					case 4: $result['erg'] = $punkte;
								break;
				}
			}
			// Statement schließen
			$stmt->close();
			return $result;	
		}
 	}
 	

 
 
 ?>